#ifndef IMMATHS_H
#define IMMATHS_H

#include <cmath>
#include <float.h>

template <typename Real>
class Maths {
public:
	static Real ACos (Real fValue);
	static Real ASin (Real fValue);
	static Real ATan (Real fValue);
	static Real ATan2 (Real fY, Real fX);
	static Real Ceil (Real fValue);
	static Real Cos (Real fValue);
	static Real Exp (Real fValue);
	static Real FAbs (Real fValue);
	static Real Floor (Real fValue);
	static Real FMod (Real fX, Real fY);
	static Real InvSqrt (Real fValue);
	static Real Log (Real fValue);
	static Real Pow (Real fBase, Real fExponent);
	static Real Sin (Real fValue);
	static Real Sqr (Real fValue);
	static Real Sqrt (Real fValue);
	static Real Tan (Real fValue);

	static const Real EPSILON;
	static const Real MAX;
	static const Real PI;
	static const Real TWO_PI;
	static const Real HALF_PI;
	static const Real INV_PI;
	static const Real INV_TWO_PI;
	static const Real DEG_TO_RAD;
	static const Real RAD_TO_DEG;
};

#include "Maths.inl"

typedef Maths<float> Mathsf;
typedef Maths<double> Mathsd;

template <typename Real> struct Vector2Tem;
template <typename Real> struct Vector3Tem;
template <typename Real> struct Vector4Tem;
template <typename Real> struct Matrix4Tem;
template <typename Real> struct AngleTem;
template <typename Real> struct QuaternionTem;

#include "Angle.h"
#include "Matrix4.h"
#include "Quaternion.h"
#include "Vector2.h"
#include "Vector3.h"
#include "Vector4.h"

#endif // IMMATHS_H